﻿using System;
using System.Collections.Generic;
using DevMaker.SIC.Model;
using log4net;


namespace DevMaker.SIC.Dao.Business {
    public class UsuarioBussiness {
        private static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        private List<Usuario> _allUsers;
        public List<Usuario> ObtieneTodos() {
            if (_allUsers != null && _allUsers.Count != 0)
                return _allUsers;
            var usuarioDao = new UsuarioDao();
            _allUsers = usuarioDao.ObtieneTodos();
            return _allUsers;
        }

        public List<Usuario> ObtieneCajerosActivos() {
            var list = ObtieneTodos();
            var listCajerosActivos = list.FindAll(foo => foo.Activo && foo.TipoUsuario == TipoUsuario.Cajero);
            return listCajerosActivos;
        }

        public List<Usuario> ObtieneTodosLosCajeros() {
            var list = ObtieneTodos();
            var listCajerosActivos = list.FindAll(foo => foo.TipoUsuario == TipoUsuario.Cajero);
            return listCajerosActivos;
        }
        public List<Usuario> ObtieneAdministradoresYSupervisoresActivos() {
            var list = ObtieneTodos();
            var listCajerosActivos =
                list.FindAll(
                    foo =>
                    foo.Activo &&
                    (foo.TipoUsuario == TipoUsuario.Supervisor || foo.TipoUsuario == TipoUsuario.Admnistrador));
            return listCajerosActivos;
        }

        public List<Usuario> Buscar(List<Usuario> usuarios, String buscar) {

            buscar = buscar.ToUpper();
            return usuarios.FindAll(
                foo =>
                foo.Nombre.ToUpper().Contains(buscar) || foo.Apellido.ToUpper().Contains(buscar) ||
                foo.UserNo.ToUpper().Contains(buscar));
        }

        public Usuario ObtieneCajeroPorId(Int32 id) {
            return ObtienePorId(ObtieneCajerosActivos(), id);
        }

        public Usuario ObtienePorId(List<Usuario> usuarios, Int32 id) {
            return usuarios.Find(foo => foo.Id == id);
        }

        public List<Usuario> ObtieneCajerosSinTurnoActivo() {
            var list = new UsuarioDao().ObtieneCajerosSinTurnoActivo();
            return list;
        }

        public List<Usuario> ObtieneCajerosConTurnoActivo() {
            var list = new UsuarioDao().ObtieneCajerosConTurnoActivo();
            return list;
        }

        public Usuario ObtienePorCodigoTarjeta(List<Usuario> usuarios, String tarjeta) {
            return usuarios.Find(foo => foo.CodigoTarjeta.Equals(tarjeta, StringComparison.InvariantCulture));
        }
    }
}
